// https://juejin.cn/post/6885973556925038599?from=search-suggest

function fullArrangement(nums) {
  const ans = []; // 最终的排列结果
  recursion(0);
  return ans;

  function recursion(emptyIndex) {
    // emptyIndex 表示当前空的格子索引，可以放入一个元素
    // 当 emptyIndex到数组末尾时，由于此时只剩下一个元素和一个格子，只可能存在一种排列，即此时无序在进行循环了
    if (emptyIndex === nums.length - 1) {
      ans.push(nums.slice());
      return;
    }

    const repeatSet = new Set(); // 记录当前第i个位置已经出现过的元素，对于重复元素，不做计算
    // 把 emptyIndex 后Y续的每一位都和当前位进行交换，相当于把剩余的球每个都匹配一次该位置
    for (let i = emptyIndex; i < nums.length; i++) {
      if (repeatSet.has(nums[i])) continue;
      swap(nums, emptyIndex, i);
      recursion(emptyIndex + 1);
      swap(nums, emptyIndex, i); // 排完之后，需要还原，再让其他的球来匹配该位置
      repeatSet.add(nums[i]);
    }
  }
}

function swap(nums, i, j) {
  const s = nums[i];
  nums[i] = nums[j];
  nums[j] = s;
}
let ans = fullArrangement([1, 2, 3])
console.log("ans", ans)
